package com.lhy.security.core;

import com.lhy.security.config.GSecurityConst;
import com.lhy.security.config.GRealm;
import org.springframework.util.DigestUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;

/**
 * @author lhy
 * @description 权限管理组件操作类
 */
public class GSecurity {

    // 数据源
    private static GRealm realm;

    // 会话管理
    private static final SSessionManager sessionManager = new SSessionManager();

    // 设置数据源
    public static void setRealm(GRealm sRealm){
        realm = sRealm;
    }

    /**
     * 当前用户是否登录
     * @return
     */
    public static Boolean isLogin(){
        return sessionManager.isLogin();
    }

    // 登录操作
    public static void login(String userName, String password){
        Objects.requireNonNull(userName, "用户名不能为空");
        Objects.requireNonNull(password, "密码不能为空");
        // 登录认证
        String dbPassword =  realm.authentication(userName);
        Objects.requireNonNull(dbPassword, "密码错误");
        if (! dbPassword.equals(getEncryptionPassword(password)))
            throw new NullPointerException("密码错误");
        // 给用户授权,并将用户信息保存到会话中
        sessionManager.saveUserInfo(userName, realm.authorization(userName));
    }

    // 退出登录状态
    public static void logout(){
        sessionManager.removeSession();
    }

    /**
     * 获取当前登录中的用户名
     * @return
     */
    public static String getUserName(){
        return sessionManager.getUsername();
    }

    /**
     * 获取当前登录用户的权限信息
     * @return
     */
    public static HashSet<String> getPermission(){
        return sessionManager.getPermission();
    }

    /**
     * 获取加密的密码
     * @param password
     * @return
     */
    public static String getEncryptionPassword(String password){
        return Arrays.toString(DigestUtils.md5Digest((password+ GSecurityConst.MD5_SALT).getBytes()));
    }

    /**
     * 获取拦截器实例对象
     * @return
     */
    public static HandlerInterceptorAdapter getInterceptor(){
        return new SInterceptor();
    }

}
